﻿/*
 * RefString.h
 *
 *  Created on: 2011/07/28
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_REFSTRING_H
#define INCLUDED_NTENGINE_REFSTRING_H

#include <string>

namespace NTEngine {
using namespace std;

/**
 * @brief 参照型文字列クラス
 * 元のデータは管理しないので、コピー元が破棄された際は不正なポインタになります。
 * ある程度の文字列操作が必要で、速度が問題になる場面で使用します。
 */
class RefString {
public:
	RefString();
	RefString( const char*, int size );
	explicit RefString( const char* );
	~RefString();
	void set( const char*, int size );
	void operator=( const char* );
	void operator=( const string& );
	char operator[]( int i ) const;
	const char* get() const;
	int size() const;
	void setSize( int );
	///lastは最後の文字そのもの。+1するな。last==-1だと始点だけ変える
	void clamp( int first, int last = -1 );
	int find( char ) const; //前から文字を探して位置を返す。見つからないと-1。
	int rfind( char ) const; //後から文字を探して位置を返す。見つからないと-1。
	///参照先文字列をコピーしてポインタを返す。自前でdeleteすること。
	char* copyOriginal() const;

	bool operator==( const RefString& ) const;
	bool operator==( const char* ) const;
	bool operator==( const string& ) const;
	bool operator!=( const RefString& ) const;
	bool operator!=( const char* ) const;
	bool operator!=( const string& ) const;
	bool operator<( const RefString& ) const;
private:
	const char* mString;
	int mSize;
};

} // namespace NTEngine

#endif // INCLUDED_NTENGINE_REFSTRING_H
